package com.ruoyi.project.info.doctor.service.impl;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Hashtable;
import java.util.List;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

import ch.qos.logback.core.util.StringCollectionUtil;
import com.ruoyi.common.exception.ServiceException;
import com.ruoyi.common.utils.DateUtils;
import com.ruoyi.common.utils.StringUtils;
import com.ruoyi.common.utils.bean.BeanValidators;
import com.ruoyi.common.utils.security.ShiroUtils;
import com.ruoyi.framework.shiro.service.PasswordService;
import com.ruoyi.framework.web.domain.AjaxResult;
import com.ruoyi.project.system.user.domain.User;
import com.ruoyi.project.system.user.mapper.UserMapper;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import com.ruoyi.project.info.doctor.mapper.DoctorMapper;
import com.ruoyi.project.info.doctor.domain.Doctor;
import com.ruoyi.project.info.doctor.service.IDoctorService;
import com.ruoyi.common.utils.text.Convert;

import static org.apache.commons.lang3.StringUtils.isNumeric;

/**
 * 医生管理Service业务层处理
 *
 * @author wzm
 * @date 2022-09-07
 */
@Service
public class DoctorServiceImpl implements IDoctorService
{
    @Autowired
    private DoctorMapper doctorMapper;
    @Autowired
    private UserMapper userMapper;
    @Autowired
    private PasswordService passwordService;

    /**
     * 查询医生管理
     *
     * @param id 医生管理主键
     * @return 医生管理
     */
    @Override
    public Doctor selectDoctorById(Long id)
    {
        return doctorMapper.selectDoctorById(id);
    }

    /**
     * 查询医生管理列表
     *
     * @param doctor 医生管理
     * @return 医生管理
     */
    @Override
    public List<Doctor> selectDoctorList(Doctor doctor)
    {
        return doctorMapper.selectDoctorList(doctor);
    }

    /**
     * 新增医生管理
     *
     * @param doctor 医生管理
     * @return 结果
     */
    @Override
    public int insertDoctor(Doctor doctor)
    {
        doctor.setStatus("0");
        User user=new User();
        user.setLoginName(doctor.getPhone());
        List<User> users=userMapper.selectUserList(user);
        if(users.size()==0){
            user.setUserName(doctor.getName());
            user.randomSalt();
            user.setSex(doctor.getSex());
            user.setType("1");
            if(StringUtils.isNotEmpty(doctor.getPassword())){
                user.setPassword(doctor.getPassword());
                user.setCreateBy("自行注册");
            }else {
                user.setCreateBy(ShiroUtils.getLoginName());
                user.setPassword("123456");
            }
            user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
            // 新增用户信息
            userMapper.insertUser(user);
        }
        doctor.setCreateTime(DateUtils.getNowDate());
        return doctorMapper.insertDoctor(doctor);
    }

    /**
     * 修改医生管理
     *
     * @param doctor 医生管理
     * @return 结果
     */
    @Override
    public int updateDoctor(Doctor doctor)
    {
        doctor.setUpdateTime(DateUtils.getNowDate());
        return doctorMapper.updateDoctor(doctor);
    }

    /**
     * 批量删除医生管理
     *
     * @param ids 需要删除的医生管理主键
     * @return 结果
     */
    @Override
    public int deleteDoctorByIds(String ids)
    {
        return doctorMapper.deleteDoctorByIds(Convert.toStrArray(ids));
    }

    /**
     * 删除医生管理信息
     *
     * @param id 医生管理主键
     * @return 结果
     */
    @Override
    public int deleteDoctorById(Long id)
    {
        return doctorMapper.deleteDoctorById(id);
    }

    @Override
    public int changeStatus(Doctor doctor) {
        return doctorMapper.updateDoctor(doctor);
    }

    @Override
    public String importUser(List<Doctor> doctorList, boolean updateSupport) {
        if (StringUtils.isNull(doctorList) || doctorList.size() == 0)
        {
            throw new ServiceException("导入医生信息不能为空！");
        }
        int successNum = 0;
        int failureNum = 0;
        StringBuilder successMsg = new StringBuilder();
        StringBuilder failureMsg = new StringBuilder();
        String operName = ShiroUtils.getLoginName();
        int num=1;
        for (Doctor doctor : doctorList)
        {
            try
            {
                if (StringUtils.isEmpty(doctor.getName()))
                {
                    failureNum++;
                    failureMsg.append("<br/>" + failureNum + "、第" +num +"行没有填写医生姓名");
                }
                if (StringUtils.isEmpty(doctor.getPhone()))
                {
                    failureNum++;
                    failureMsg.append("<br/>" + failureNum + "、第" +num +"行没有填写医生手机号");
                }else {
                    if(!validPhoneNum("0",doctor.getPhone())){
                        failureNum++;
                        failureMsg.append("<br/>" + failureNum + "、第" +num +"行填写医生手机号格式不正确");
                    }
                    Doctor doctor1=new Doctor();
                    doctor1.setPhone(doctor.getPhone().replaceAll(" ",""));
                    doctor.setPhone(doctor1.getPhone());
                    List<Doctor> doctors=doctorMapper.selectDoctorList(doctor1);
                    if(doctors!=null&&doctors.size()>0){
                        failureNum++;
                        failureMsg.append("<br/>" + failureNum + "、第" +num +"行填写的医生手机号已存在");
                    }
                }
                if (StringUtils.isNotEmpty(doctor.getIdcard()))
                {
                    if(!IDCardValidate(doctor.getIdcard())){
                        failureNum++;
                        failureMsg.append("<br/>" + failureNum + "、第" +num +"行填写医生身份证号格式不正确");
                    }
                    Doctor doctor1=new Doctor();
                    doctor1.setIdcard(doctor.getIdcard());
                    List<Doctor> doctors=doctorMapper.selectDoctorList(doctor1);
                    if(doctors!=null&&doctors.size()>0){
                        failureNum++;
                        failureMsg.append("<br/>" + failureNum + "、第" +num +"行填写的医生身份证号已存在");
                    }
                }
                num++;
            }
            catch (Exception e)
            {
                failureNum++;
                String msg = "<br/>" + failureNum + "、第" +num + " 导入失败：";
                failureMsg.append(msg + e.getMessage());
            }
        }
        if (failureNum > 0)
        {
            failureMsg.insert(0, "很抱歉，导入失败！共 " + failureNum + " 条数据格式不正确，错误如下：");
            throw new ServiceException(failureMsg.toString());
        }
        else
        {
            for(Doctor doctor:doctorList){
                doctor.setStatus("0");
                User user=new User();
                user.setLoginName(doctor.getPhone());
                List<User> users=userMapper.selectUserList(user);
                if(users.size()==0){
                    user.setUserName(doctor.getName());
                    user.randomSalt();
                    user.setSex(doctor.getSex());
                    user.setType("1");
                    if(StringUtils.isNotEmpty(doctor.getPassword())){
                        user.setPassword(doctor.getPassword());
                        user.setCreateBy("自行注册");
                    }else {
                        user.setCreateBy(ShiroUtils.getLoginName());
                        user.setPassword("123456");
                    }
                    user.setPassword(passwordService.encryptPassword(user.getLoginName(), user.getPassword(), user.getSalt()));
                    // 新增用户信息
                    userMapper.insertUser(user);
                }
                doctor.setCreateTime(DateUtils.getNowDate());
                doctorMapper.insertDoctor(doctor);
                successNum++;
            }
            successMsg.insert(0, "恭喜您，数据已全部导入成功！共 " + successNum + " 条，数据如下：");
        }
        return successMsg.toString();
    }

    /**
     * @param checkType 校验类型：0校验手机号码，1校验座机号码，2两者都校验满足其一就可
     * @param phoneNum
     * */
    public static boolean validPhoneNum(String checkType,String phoneNum){
        boolean flag=false;
        Pattern p1 = null;
        Pattern p2 = null;
        Matcher m = null;
        p1 = Pattern.compile("^(((13[0-9]{1})|(15[0-9]{1})|(18[0-9]{1})|(17[0-9]{1}))+\\d{8})?$");
        p2 = Pattern.compile("^(0[0-9]{2,3}\\-)?([1-9][0-9]{6,7})$");
        if("0".equals(checkType)){
            System.out.println(phoneNum.length());
            if(phoneNum.length()!=11){
                return false;
            }else{
                m = p1.matcher(phoneNum);
                flag = m.matches();
            }
        }else if("1".equals(checkType)){
            if(phoneNum.length()<11||phoneNum.length()>=16){
                return false;
            }else{
                m = p2.matcher(phoneNum);
                flag = m.matches();
            }
        }else if("2".equals(checkType)){
            if(!((phoneNum.length() == 11 && p1.matcher(phoneNum).matches())||(phoneNum.length()<16&&p2.matcher(phoneNum).matches()))){
                return false;
            }else{
                flag = true;
            }
        }
        return flag;
    }
    /**
     * 功能：身份证的有效验证
     */
    public static boolean IDCardValidate(String IDStr) throws ParseException {
        IDStr = IDStr.trim().toUpperCase();
        String errorInfo = "";// 记录错误信息
        String[] ValCodeArr = { "1", "0", "X", "9", "8", "7", "6", "5", "4", "3", "2" };
        String[] Wi = { "7", "9", "10", "5", "8", "4", "2", "1", "6", "3", "7", "9", "10", "5", "8", "4", "2" };
        String Ai = "";
        // ================ 号码的长度 15位或18位 ================
        if (IDStr.length() != 15 && IDStr.length() != 18) {
            //身份证号码长度应该为15位或18位
            return false;
        }
        // =======================(end)========================

        // ================ 数字 除最后以为都为数字 ================
        if (IDStr.length() == 18) {
            Ai = IDStr.substring(0, 17);
        } else if (IDStr.length() == 15) {
            Ai = IDStr.substring(0, 6) + "19" + IDStr.substring(6, 15);
        }
        if (isNumeric(Ai) == false) {
            //身份证15位号码都应为数字 ; 18位号码除最后一位外，都应为数字。
            return false;
        }
        // =======================(end)========================

        // ================ 出生年月是否有效 ================
        String strYear = Ai.substring(6, 10);// 年份
        String strMonth = Ai.substring(10, 12);// 月份
        String strDay = Ai.substring(12, 14);// 月份
        if (isDataFormat(strYear + "-" + strMonth + "-" + strDay) == false) {
            //身份证生日无效。
            return false;
        }
        GregorianCalendar gc = new GregorianCalendar();
        SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd");
        if ((gc.get(Calendar.YEAR) - Integer.parseInt(strYear)) > 150
                || (gc.getTime().getTime() - s.parse(strYear + "-" + strMonth + "-" + strDay).getTime()) < 0) {
            //身份证生日不在有效范围。
            return false;
        }
        if (Integer.parseInt(strMonth) > 12 || Integer.parseInt(strMonth) == 0) {
            //身份证月份无效
            return false;
        }
        if (Integer.parseInt(strDay) > 31 || Integer.parseInt(strDay) == 0) {
            //身份证日期无效
            return false;
        }
        // =====================(end)=====================

        // ================ 地区码时候有效 ================
        Hashtable h = GetAreaCode();
        if (h.get(Ai.substring(0, 2)) == null) {
            //身份证地区编码错误。
            return false;
        }
        // ==============================================

        // ================ 判断最后一位的值 ================
        int TotalmulAiWi = 0;
        for (int i = 0; i < 17; i++) {
            TotalmulAiWi = TotalmulAiWi + Integer.parseInt(String.valueOf(Ai.charAt(i))) * Integer.parseInt(Wi[i]);
        }
        int modValue = TotalmulAiWi % 11;
        String strVerifyCode = ValCodeArr[modValue];
        Ai = Ai + strVerifyCode;

        if (IDStr.length() == 18) {
            if (Ai.equals(IDStr) == false) {
                //身份证无效，不是合法的身份证号码
                return false;
            }
        } else {
            return true;
        }
        // =====================(end)=====================
        return true;
    }
    /**
     * 验证日期字符串是否是YYYY-MM-DD格式
     */
    public static boolean isDataFormat(String str) {
        boolean flag = false;
        // String
        // regxStr="[1-9][0-9]{3}-[0-1][0-2]-((0[1-9])|([12][0-9])|(3[01]))";
        String regxStr = "^((\\d{2}(([02468][048])|([13579][26]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])))))|(\\d{2}(([02468][1235679])|([13579][01345789]))[\\-\\/\\s]?((((0?[13578])|(1[02]))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(3[01])))|(((0?[469])|(11))[\\-\\/\\s]?((0?[1-9])|([1-2][0-9])|(30)))|(0?2[\\-\\/\\s]?((0?[1-9])|(1[0-9])|(2[0-8]))))))(\\s(((0?[0-9])|([1-2][0-3]))\\:([0-5]?[0-9])((\\s)|(\\:([0-5]?[0-9])))))?$";
        Pattern pattern1 = Pattern.compile(regxStr);
        Matcher isNo = pattern1.matcher(str);
        if (isNo.matches()) {
            flag = true;
        }
        return flag;
    }

    /**
     * 功能：判断字符串是否为数字
     */
    private static boolean isNumeric(String str) {
        Pattern pattern = Pattern.compile("[0-9]*");
        Matcher isNum = pattern.matcher(str);
        if (isNum.matches()) {
            return true;
        } else {
            return false;
        }
    }
    /**
     * 功能：设置地区编码
     */
    private static Hashtable GetAreaCode() {
        Hashtable hashtable = new Hashtable();
        hashtable.put("11", "北京");
        hashtable.put("12", "天津");
        hashtable.put("13", "河北");
        hashtable.put("14", "山西");
        hashtable.put("15", "内蒙古");
        hashtable.put("21", "辽宁");
        hashtable.put("22", "吉林");
        hashtable.put("23", "黑龙江");
        hashtable.put("31", "上海");
        hashtable.put("32", "江苏");
        hashtable.put("33", "浙江");
        hashtable.put("34", "安徽");
        hashtable.put("35", "福建");
        hashtable.put("36", "江西");
        hashtable.put("37", "山东");
        hashtable.put("41", "河南");
        hashtable.put("42", "湖北");
        hashtable.put("43", "湖南");
        hashtable.put("44", "广东");
        hashtable.put("45", "广西");
        hashtable.put("46", "海南");
        hashtable.put("50", "重庆");
        hashtable.put("51", "四川");
        hashtable.put("52", "贵州");
        hashtable.put("53", "云南");
        hashtable.put("54", "西藏");
        hashtable.put("61", "陕西");
        hashtable.put("62", "甘肃");
        hashtable.put("63", "青海");
        hashtable.put("64", "宁夏");
        hashtable.put("65", "新疆");
        hashtable.put("71", "台湾");
        hashtable.put("81", "香港");
        hashtable.put("82", "澳门");
        hashtable.put("91", "国外");
        return hashtable;
    }
}
